;=================================================
;判断是否位0
;FlameCyclone
;2024.8.7
;=================================================
;判断是否位0
;FC_Is_Zero_16          最差耗时 39       指令长度: 12
;FC_Is_Zero_16_Fast     最差耗时 30       指令长度: 12
;FC_Is_Zero_32          最差耗时 63       指令长度: 12
;FC_Is_Zero_32_Fast     最差耗时 48       指令长度: 22
;FC_Is_Zero_64          最差耗时 111      指令长度: 12
;FC_Is_Zero_64_Fast     最差耗时 84       指令长度: 42
;=================================================
FC_Data_Src_L               = $40
FC_Data_Src_H               = $41
FC_Data_Dest_L              = $42
FC_Data_Dest_H              = $43
FC_Data_Result_L            = $44
FC_Data_Result_H            = $45
;=================================================
    .INESPRG 1      ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
    .INESCHR 0       ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
    .INESMAP 4          ;Mapper号 (0-4095)
    .BANK 1
    .ORG $E000
;=================================================
Reset_Program
    SEI
    CLD
    LDA #$00
    STA $2000
    STA $2001
    LDA #$C0
    STA $4017
    STA $E000
    LDX #$FF
    TXS
    
    JSR Test

.Loop
    JMP .Loop

;=================================================
Test
    JSR Test_Is_Zero_16
    JSR Test_Is_Zero_16_Fast
    JSR Test_Is_Zero_32
    JSR Test_Is_Zero_32_Fast
    JSR Test_Is_Zero_64
    JSR Test_Is_Zero_64_Fast
    RTS

Test_Is_Zero_16
    LDA #<.Test_Src
    STA FC_Data_Src_L
    LDA #>.Test_Src
    STA FC_Data_Src_H
    LDA #<.Test_Dest
    STA FC_Data_Dest_L
    LDA #>.Test_Dest
    STA FC_Data_Dest_H
    
    BIT $FFFF
    JSR FC_Is_Zero_16
    RTS
.Test_Src
    .DW $0000
.Test_Dest
    .DW $0000

Test_Is_Zero_16_Fast
    LDA #<.Test_Src
    STA FC_Data_Src_L
    LDA #>.Test_Src
    STA FC_Data_Src_H
    LDA #<.Test_Dest
    STA FC_Data_Dest_L
    LDA #>.Test_Dest
    STA FC_Data_Dest_H
    
    BIT $FFFF
    JSR FC_Is_Zero_16_Fast
    RTS
.Test_Src
    .DW $0000
.Test_Dest
    .DW $0000

Test_Is_Zero_32
    LDA #<.Test_Src
    STA FC_Data_Src_L
    LDA #>.Test_Src
    STA FC_Data_Src_H
    LDA #<.Test_Dest
    STA FC_Data_Dest_L
    LDA #>.Test_Dest
    STA FC_Data_Dest_H
    
    BIT $FFFF
    JSR FC_Is_Zero_32
    RTS
.Test_Src
    .DW $0000
    .DW $0000
.Test_Dest
    .DW $0000
    .DW $0000

Test_Is_Zero_32_Fast
    LDA #<.Test_Src
    STA FC_Data_Src_L
    LDA #>.Test_Src
    STA FC_Data_Src_H
    LDA #<.Test_Dest
    STA FC_Data_Dest_L
    LDA #>.Test_Dest
    STA FC_Data_Dest_H
    
    BIT $FFFF
    JSR FC_Is_Zero_32_Fast
    RTS
.Test_Src
    .DW $0000
    .DW $0000
.Test_Dest
    .DW $0000
    .DW $0000

Test_Is_Zero_64
    LDA #<.Test_Src
    STA FC_Data_Src_L
    LDA #>.Test_Src
    STA FC_Data_Src_H
    LDA #<.Test_Dest
    STA FC_Data_Dest_L
    LDA #>.Test_Dest
    STA FC_Data_Dest_H
    
    BIT $FFFF
    JSR FC_Is_Zero_64
    RTS
.Test_Src
    .DW $0000
    .DW $0000
    .DW $0000
    .DW $0000
.Test_Dest
    .DW $0000
    .DW $0000
    .DW $0000
    .DW $0000

Test_Is_Zero_64_Fast
    LDA #<.Test_Src
    STA FC_Data_Src_L
    LDA #>.Test_Src
    STA FC_Data_Src_H
    LDA #<.Test_Dest
    STA FC_Data_Dest_L
    LDA #>.Test_Dest
    STA FC_Data_Dest_H
    
    BIT $FFFF
    JSR FC_Is_Zero_64_Fast
    RTS
.Test_Src
    .DW $0000
    .DW $0000
    .DW $0000
    .DW $0000
.Test_Dest
    .DW $0000
    .DW $0000
    .DW $0000
    .DW $0000

;=================================================
;32位整数检测是否为0
;最多耗时周期: 39
;编译指令长度: 12
FC_Is_Zero_16
    LDY #$01
FC_Is_Zero_16_Data
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_16_End
    DEY
    BPL FC_Is_Zero_16_Data
    LDA #$00
FC_Is_Zero_16_End
    RTS

;=================================================
;32位整数检测是否为0
;最多耗时周期: 30
;编译指令长度: 12
FC_Is_Zero_16_Fast
    LDY #$03
FC_Is_Zero_16_Fast_Data
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_16_Fast_Data
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_16_Fast_Data
FC_Is_Zero_16_Fast_End
    RTS

;=================================================
;32位整数检测是否为0
;最多耗时周期: 63
;编译指令长度: 12
FC_Is_Zero_32
    LDY #$03
FC_Is_Zero_32_Data
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_32_End
    DEY
    BPL FC_Is_Zero_32_Data
    LDA #$00
FC_Is_Zero_32_End
    RTS

;=================================================
;32位整数检测是否为0
;最多耗时周期: 48
;编译指令长度: 22
FC_Is_Zero_32_Fast
    LDY #$03
FC_Is_Zero_32_Fast_Data
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_32_Fast_Data
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_32_Fast_Data
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_32_Fast_Data
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_32_Fast_Data
FC_Is_Zero_32_Fast_End
    RTS

;=================================================
;64位整数检测是否为0
;最多耗时周期: 111
;编译指令长度: 12
FC_Is_Zero_64
    LDY #$07
FC_Is_Zero_64_Data
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_End
    DEY
    BPL FC_Is_Zero_64_Data
    LDA #$00
FC_Is_Zero_64_End
    RTS

;=================================================
;64位整数检测是否为0
;最多耗时周期: 84
;编译指令长度: 42
FC_Is_Zero_64_Fast
    LDY #$07
FC_Is_Zero_64_Fast_Data
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
    DEY
    LDA (FC_Data_Src_L),Y
    BNE FC_Is_Zero_64_Fast_End
FC_Is_Zero_64_Fast_End
    RTS

;=================================================
;NES 入口
    .ORG $FFFA
    .DW 0
    .DW Reset_Program
    .DW 0
    